

/**
 * 获取 token 的当前状态，刷新 token 的有效时长比访问 token 时长要长一些，
 *   如果刷新 token 过期了，则访问 token 一定过期了
 *   如果访问 token 没有过期，则刷新 token 一定没过期
 *
 * return undefined：表示无 toekn 信息
 *  refresh_expires: 表示刷新 token 已经过期
 *  access_expires: 表示访问 token 已经过期
 *  about_to_expires: 表示访问 token 即将已经过期
 *  no_expires: 表示访问 token 没有过期
 */
export function getTokenStatue(token){
    if (!token || !token.expires){
        return;
    }

    //过期时间不足10秒，认为 token 已过期
    if((token.expires.getTime() - 10 * 1000) < new Date().getTime()){

        //如果有刷新 token（client认证是没有刷新 token 的） 并且没有过期
        if(token.refreshExpires && (token.refreshExpires.getTime() - 10 * 1000)  < new Date().getTime()){
            //表示刷新 token 已过期，正常刷新 token 时间比 访问 token 时间长，所以刷新 token 过期也可以认为访问 token 也过期了
            return 'refresh_expires';
        }
        return 'access_expires';//表示访问 token 已经过期，但刷新 token 还没有过期
    }

    //当token即将过期，则到认证服务重新获取token
    //当token还有 5分钟 过期时，则认为即将过期
    //或者过了有效时间的一半，都认为即将过期，这样虽说增加了刷新 token 的次数（），但能让用户能够有更好的体验
    var expiresIn = token.expiresIn / 2 * 1000;
    if(expiresIn > 10 * 60 * 1000){
        expiresIn = 10 * 60 * 1000;
    }else if(expiresIn < 2 * 60 * 1000){
        expiresIn = 2 * 60 * 1000;
    }
    if((token.expires.getTime() - 300 * 1000) < new Date().getTime()
      ||(token.expires.getTime() - expiresIn) < new Date().getTime()) {
        return 'about_to_expires';
    }

    //表示没有过期
    return 'no_expires';
}
